package com.zt.chatglm.domain.chat;

import com.alibaba.fastjson2.JSON;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.*;

import java.util.List;

/**
 * @author: zt
 * @Description: 响应结果
 * @create: 2024-05-20 16:25
 */

@Data
@ToString
public class ChatCompletionResponse {

    /**
     * 响应数据
     */
    private String data;
    private String meta;

    // 24年1月发布的 GLM_3_5_TURBO、GLM_4 模型时新增
    /**
     * 用户在客户端请求时提交的任务编号或者平台生成的任务编号
     */
    private String id;
    private Long created;

    /**
     * 本次调用的模型名称
     */
    private String model;
    /**
     * 当前对话的模型输出内容，目前只返回一条
     */
    private List<Choice> choices;

    /**
     * 本次模型调用的 tokens 数量统计
     */
    private Usage usage;


    /**
     *  封装 setChoices 对 data 属性赋值，兼容旧版使用方式
      */
    public void setChoices(List<Choice> choices) {
        this.choices = choices;
        for (Choice choice : choices) {
            if ("stop".equals(choice.finishReason)) {
                continue;
            }
            if (null == this.data) {
                this.data = "";
            }
            this.data = this.data.concat(choice.getDelta().getContent());
        }
    }

    /**
     * 封装 setChoices 对 meta 属性赋值，兼容旧版使用方式
     * @param usage
     */
    public void setUsage(Usage usage) {
        this.usage = usage;
        if (null != usage) {
            this.meta = JSON.toJSONString(Meta.builder().usage(usage).build());
        }
    }


    @Data
    public static class Choice {
        /**
         * 结果下标
         */
        private Long index;
        /**
         * 模型推理终止的原因。
         * stop代表推理自然结束或触发停止词。
         * tool_calls 代表模型命中函数。
         * length代表到达 tokens 长度上限。
         * sensitive 代表模型推理内容被安全审核接口拦截。请注意，针对此类内容，请用户自行判断并决定是否撤回已公开的内容。
         * network_error 代表模型推理异常
         */
        @JsonProperty("finish_reason")
        private String finishReason;
        /**
         * 模型返回的文本信息
         */
        private Delta delta;

        public Long getIndex() {
            return index;
        }

        public void setIndex(Long index) {
            this.index = index;
        }

        public String getFinishReason() {
            return finishReason;
        }

        public void setFinishReason(String finishReason) {
            this.finishReason = finishReason;
        }

        public Delta getDelta() {
            return delta;
        }

        public void setDelta(Delta delta) {
            this.delta = delta;
        }
    }

    @Data
    public static class Delta {
        /**
         * 当前对话的角色，目前默认为 assistant（模型）
         */
        private String role;
        /**
         * 当前对话的内容。命中函数时此字段为null，未命中函数时返回模型推理结果。
         */
        private String content;
    }

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    @Builder
    public static class Meta {
        /**
         * 处理状态，PROCESSING（处理中），SUCCESS（成功），FAIL（失败）
         * 注：处理中状态需通过查询获取结果
         */
        private String task_status;
        /**
         * 本次模型调用的 tokens 数量统计
         */
        private Usage usage;
        private String task_id;
        /**
         * 用户在客户端请求时提交的任务编号或者平台生成的任务编号
         */
        private String request_id;
    }

    @Data
    public static class Usage {
        /**
         * 用户输入的 tokens 数量
         */
        private int completion_tokens;
        /**
         * 模型输出的 tokens 数量
         */
        private int prompt_tokens;
        /**
         * 总 tokens 数量
         */
        private int total_tokens;
    }
}
